#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 20;

// 不按照顺序的话, 也就是说可以随便取, 那就可以使用状态压缩, 使用二进制将所有的情况枚举出来
// 使用 dp[i][j] 表示 i 的情况下以 tail[j] 结尾时最多的字符串
// 这时你可能会想 i 情况下, 那么多的 1 你怎么就能说他是以 tail[j] 结尾的呢
// 但是我们是 从小到大 慢慢遍历 的, 也就是 1 是一个一个加上去的, 那么 一定就可以覆盖住所有的情况
// 所以当前情况一定是可以从前面的状态转移过来的 

int dp[1<<maxn][25]; // 表示 i 的二进制位 的所表示的相关字符串 中 以 tail[j] 结尾的长度
// 第 i 个字符串的 头尾字母

char head[maxn];
char tail[maxn];

int n;
void solve(){
	cin>>n;
	for (int i=1;i<=n;i++) {
		string s;
		cin >> s;
		head[i]=s[0];
		tail[i]=s[s.size()-1];
		dp[1<<(i-1)][tail[i]-'a']=1;
	}
	
	
	// 状压 DP
	for (int i=0;i<(1<<n);i++) {
		for (int j=1;j<=n;j++) {
			if ((i>>(j-1))&1) { // 让它以 tail[j] 结尾的
				dp[i][tail[j]-'a'] = max(dp[i][tail[j]-'a'], dp[i^(1<<(j-1))][head[j]-'a']+1); // 注意这里面的转移, 是由把第 j个 去掉的情况转移过来的 
//				cout<<"i "<<i<<" j "<<j<<' '<<dp[i][tail[j]-'a']<<'\n';
			}
		}
	}
	
	int ans=0;
	for (int i=0;i<(1<<n);i++) {
		for (int j=1;j<=n;j++) {
			ans = max(ans, dp[i][tail[j]-'a']);
		}
	}
	
	cout << ans << '\n';
	
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
